package tree.searchTree;

/**
 * @author czt
 * @version 1.0
 * @since 2024/12/30
 */
public class BSTree2<T extends Comparable<T>,V> {

    static class BSTNode<T,V> {

        T key;

        V value;

        BSTNode<T,V> left;

        BSTNode<T,V> right;

        public BSTNode(T key) {
            this.key = key;
        }

        public BSTNode(T key, V value) {
            this.key = key;
            this.value = value;
        }

        public BSTNode(T key, V value, BSTNode<T,V> left, BSTNode<T,V> right) {
            this.key = key;
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }

    BSTNode<T,V> root; // 根节点

    /**
     * 查找关键字对应的值
     * @param key 关键字
     * @return 值
     */
    public V get(T key) {
        BSTNode<T,V> node = root;
        while (node != null) {
            // 待查找key和当前key比较
            /*
            返回说明:
                1   key > node.key
               -1   key < node.key
                0   key = node.key
             */
            int result = key.compareTo(node.key);
            if (result < 0) {
                node = node.left;
            } else if (result > 0) {
                node = node.right;
            } else {
                return node.value;
            }
        }
        return null;
    }

    /**
     * 查找最小关键字的值
     * @return 值
     */
    public Object min() {
        return null;
    }

    /**
     * 查找最大关键字的值
     * @return 值
     */
    public Object max() {
        return null;
    }

    /**
     * 存储关键字和对应的值
     * @param key 关键字
     * @param value 值
     */
    public void put(int key, Object value) {

    }

    /**
     * 查找关键字的前驱值
     * @param key 关键字
     * @return 前驱值
     */
    public Object successor(int key) {
        return null;
    }

    /**
     * 查找关键字的后继值
     * @param key 关键字
     * @return 后继值
     */
    public Object predecessor(int key) {
        return null;
    }

    /**
     * 根据关键字删除
     * @param key 关键字
     * @return 被删除关键字的对应值
     */
    public Object delete(int key) {
        return null;
    }
}
